package com.football.gkjo.server;

import java.io.IOException;
import java.util.ArrayList;

public class GKJoMatch {
	

	// 매치에 접속한 클라이언트들의 목록
	private ArrayList<GKJoServerThread> matchClients;

	// 매치 이름
	private String matchTitle;

	// 매치 번호 (synchronized를 해주려면 객체여야 하기 때문이다.)
	private int matchNo;

	// 매치 개설자
	private String matchOwnnerId;

	public GKJoMatch(int matchNo, String matchTitle, String matchOwnnerId) {
		this.matchNo = matchNo;
		this.matchTitle = matchTitle;
		this.matchOwnnerId = matchOwnnerId;
		this.matchClients = new ArrayList<GKJoServerThread>();

	}

	public void setMatchNo(int matchNo) {
		this.matchNo = matchNo;
	}

	public int getMatchNo() {
		return this.matchNo;
	}

	public String getMatchOwnerId() {
		return this.matchOwnnerId;
	}

	public String getMatchTitle() {
		return this.matchTitle;
	}

	// 매치방에 접속된 클라이언트 수 getter
	public int getMatchClientNum() {
		return matchClients.size();
	}

	public String getMatchInfo() {
		String msg = "";
		msg = String.format("%5d %-25s %-20s [%3d/%3d]", matchNo, matchTitle,
				matchOwnnerId, matchClients.size(), GKJoServerThread.LIMIT_MATCH) + "\n";
		return msg;
	}

	// 방에 있는 사람들에게 메시지 전달
	public void sendMsgToAllinChannel(String message) throws IOException {
		synchronized (matchClients) {
			for (int i = 0; i < matchClients.size(); i++) {
				GKJoServerThread client = matchClients.get(i);
				client.sendMessage(message);
			}
		}
	}
	


	// 채팅방에 참여 시키기
	public boolean letClientJoin(GKJoServerThread gsThread) throws IOException {
		
		// 전체에게 메시지 보내고 사용자 목록에 추가
		sendMsgToAllinChannel(gsThread.getUserId() + "님께서 접속하셨습니다.");

		synchronized (matchClients) {
			matchClients.add(gsThread);
		}
		gsThread.sendMessage("[" + matchNo + "] [" + matchTitle
				+ "] 매치에 접속하셨습니다.");

		while (true) {

			String message = gsThread.readMessage();
			if ("/quit".equals(message)) {
				// true면 모든 사용자가 나갔다는 이야기다.
				return letClientLeave(gsThread);
			}
			sendMsgToAllinChannel(gsThread.getUserId() + " : " + message);
		}
	}

	// 방에 모든 인원이 사라지면 true, 아니면 false
	public boolean letClientLeave(GKJoServerThread gsThread) throws IOException {
		synchronized (matchClients) {
			// 접속 회원을 remove 한다.
			matchClients.remove(gsThread);
		}
		if (matchClients.size() == 0) {
			gsThread.sendMessage("매치에서 나왔습니다.");
			return true;
		} else {
			// 매치 개설자의 이름을 바꿔준다.
			this.matchOwnnerId = matchClients.get(0).getUserId();
			sendMsgToAllinChannel(gsThread.getUserId() + "님이 나가셨습니다.");
			return false;
		}

	}
}
